[アップデート]Amazon CloudWatch Logs は、フィルターパターンに正規表現が扱えるようになりました
はじめに
Amazon CloudWatch Logsのフィルターパターン構文が正規表現をサポートするようになりました。
CloudWatch Logsでは、フィルターパターン構文を使ってログを検索したり、メトリクスフィルターを用いてメトリクスを抽出したり、サブスクリプションフィルターを利用して特定のログを他の宛先(Lambdaなど)へ送信することができます
今回のアップデートにより、フィルターパターン構文に正規表現を用いて、関連するログの検索とマッチングがより簡単になります。
サポートされている正規表現は、以下の通りです
- 英数字
- 文字 (A ~ Z または a ~ z) または数字 (0 ~ 9) のいずれかの文字です
- 記号文字
_
、#
、=
、@
、/
、;
、,
、-
!
などは利用できません
- 演算子
^
、$
、?
、[
、]
、{
、}
、|
、\
、*
、+
、.
、`(
や)
などは利用できません
また、正規表現を利用する場合、式に対して%
で囲む必要があります。
サポートされている正規表現の演算子は、下記ドキュメントに、1つ1つ分かりやすく解説されていますので、一読ください。
やってみた
ログストリームのログの検索やサブスクリプションフィルターで、正規表現を利用してみます。
特定のステータスコード
ステータスコードが4xxのJSONログイベントだけを取得したい場合、以下のような正規表現を使用します。(他にも方法はあり得ます)
{ $.statusCode=%4[0-9]{2}% }
先程もお伝えしたように、正規表現を利用する場合、対象を%
で囲む必要があります。
{2}
は、前の用語を2回以上利用する値に一致します。
マッチする内容は、ステータスコードが403や401です。
{ "statusCode": "403" } { "statusCode": "400" }
サブスクリプションフィルターでも同様の結果でした。
マッチしない内容は、4xx以外の内容です。
{ "statusCode": "503" } { "statusCode": "300" }
ログレベル
特定のログレベル(DEBUG、ERROR、WARN)のJSONログイベントをチェックしたい場合は、以下の正規表現を使用します。
{ $.loglevel = %DEBUG|ERROR|WARN% }
OR表現は、|
を使います
マッチする内容は、ログレベルがDEBUG, ERROR, WARNのみです。
{ "loglevel": "ERROR" } { "loglevel": "DEBUG" }
マッチしない内容は、異なるログレベルや小文字の場合です
{ "statusCode": "INFORMATION" } { "statusCode": "error" }
URL
非構造化ログイベントの中で、特定ドメイン(test.com
)を含むログをフィルタリングしたい場合、以下の正規表現を使用します。
%test\.com*%
.
は、サポートされている演算子であり、「任意の1文字と一致する」という内容のため、\
でエスケープさせます。
マッチする内容は、ログにtest.com
が記載されている場合のみです。
https://test.com/hoge https://sub.test.com/hoge
マッチしない内容は、ログにtest.com
の記載がない場合です。
https://sub.hoge.com/hoge
特定の日付
非構造化ログイベントの中で、特定の日付範囲(YYYY-MM-DD形式)を確認したい場合、以下の正規表現を使用します。
%2023-\d{2}-\d{2}%
\d
は、数字の値と一致します。
マッチする内容は、YYYY-MM-DD形式の2023年の日付です。
2023-10-04 2023-03-21
マッチしない内容は、YYYY-MM-DD形式ではない場合や、2023年でない場合です。
2024-10-04 2023-10-4
除外キーワード
一般的に除外したいキーワードを正規表現で表す場合、^(?!.*apple)
いった表現をします。
CloudWatch Logsの正規表現構文に、(
と)
サポートされていませんので、エラーとなります。
そのため、apple
を除外キーワードとしたい場合、正規表現では対応できないため、従来通り- apple
を使用するとよさそうです。
もしできる方法があれば教えてください。。
最後に
今回は、Amazon CloudWatch Logsのフィルター機能が正規表現をサポートしたことを紹介しました。
従来、複数のフィルタを定義していたケースがありますが、正規表現がサポートされることで、フィルタを1つ定義できるようになることもありますので、より検索がしやすくなります。
ただし、全ての正規表現をサポートしているわけではないことに注意が必要です(例えば、(
や)
です)。